/*
 * Copyright 2017-2020 吴学文 and java110 team.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.java110.mall.goods.smo.impl;


import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.dto.PageDto;
import com.java110.dto.product.ProductPriceRuleDto;
import com.java110.dto.product.ProductSpecValueDto;
import com.java110.intf.goods.IProductPriceRuleV1InnerServiceSMO;
import com.java110.mall.goods.dao.IProductPriceRuleV1ServiceDao;
import com.java110.po.product.ProductPriceRulePo;
import com.java110.utils.util.BeanConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;

/**
 * 类表述： 服务之前调用的接口实现类，不对外提供接口能力 只用于接口建调用
 * add by 吴学文 at 2022-07-01 10:18:07 mail: 928255095@qq.com
 * open source address: https://gitee.com/wuxw7/MicroCommunity
 * 官网：http://www.homecommunity.cn
 * 温馨提示：如果您对此文件进行修改 请不要删除原有作者及注释信息，请补充您的 修改的原因以及联系邮箱如下
 * modify by 张三 at 2021-09-12 第10行在某种场景下存在某种bug 需要修复，注释10至20行 加入 20行至30行
 **/

@RestController
public class ProductPriceRuleV1InnerServiceSMOImpl extends BaseServiceSMO implements IProductPriceRuleV1InnerServiceSMO {

    @Autowired
    private IProductPriceRuleV1ServiceDao productPriceRuleV1ServiceDaoImpl;


    @Override
    public int saveProductPriceRule(@RequestBody ProductPriceRulePo productPriceRulePo) {
        int saveFlag = productPriceRuleV1ServiceDaoImpl.saveProductPriceRuleInfo(BeanConvertUtil.beanCovertMap(productPriceRulePo));
        return saveFlag;
    }

    @Override
    public int updateProductPriceRule(@RequestBody ProductPriceRulePo productPriceRulePo) {
        int saveFlag = productPriceRuleV1ServiceDaoImpl.updateProductPriceRuleInfo(BeanConvertUtil.beanCovertMap(productPriceRulePo));
        return saveFlag;
    }

    @Override
    public int deleteProductPriceRule(@RequestBody ProductPriceRulePo productPriceRulePo) {
        productPriceRulePo.setStatusCd("1");
        int saveFlag = productPriceRuleV1ServiceDaoImpl.updateProductPriceRuleInfo(BeanConvertUtil.beanCovertMap(productPriceRulePo));
        return saveFlag;
    }

    @Override
    public List<ProductPriceRuleDto> queryProductPriceRules(@RequestBody ProductPriceRuleDto productPriceRuleDto) {

        //校验是否传了 分页信息

        int page = productPriceRuleDto.getPage();

        if (page != PageDto.DEFAULT_PAGE) {
            productPriceRuleDto.setPage((page - 1) * productPriceRuleDto.getRow());
        }

        List<ProductPriceRuleDto> productPriceRules = BeanConvertUtil.covertBeanList(productPriceRuleV1ServiceDaoImpl.getProductPriceRuleInfo(BeanConvertUtil.beanCovertMap(productPriceRuleDto)), ProductPriceRuleDto.class);

        return productPriceRules;
    }

    @Override
    public List<ProductSpecValueDto> computeProductSpecValuePrices(@RequestBody ProductPriceRuleDto productPriceRuleDto) {
        List<ProductSpecValueDto> productSpecValueDtos = productPriceRuleDto.getProductSpecValueDtos();
        if (productSpecValueDtos == null || productSpecValueDtos.size() < 1) {
            return productSpecValueDtos;
        }

        double basePrice = 0.0;
        Double vipPrice = Double.parseDouble(productPriceRuleDto.getVipPrice());
        Double deduction = Double.parseDouble(productPriceRuleDto.getDeduction());
        Double ownerPrice = Double.parseDouble(productPriceRuleDto.getOwnerPrice());
        Double otPrice = Double.parseDouble(productPriceRuleDto.getOtPrice());
        Double price = Double.parseDouble(productPriceRuleDto.getPrice());
        BigDecimal priceDec = null;
        BigDecimal profitDec = null;

        for (ProductSpecValueDto productSpecValueDto : productSpecValueDtos) {
            // 市场 价格
            basePrice = computeBasePrice(productSpecValueDto,productPriceRuleDto,"otPrice");
            priceDec = new BigDecimal(otPrice).divide(new BigDecimal(100)).multiply(new BigDecimal(basePrice)).setScale(2, BigDecimal.ROUND_HALF_UP);
            productSpecValueDto.setOtPrice(priceDec.doubleValue() + "");

            // 销售 价格
            basePrice = computeBasePrice(productSpecValueDto,productPriceRuleDto,"price");
            priceDec = new BigDecimal(price).divide(new BigDecimal(100)).multiply(new BigDecimal(basePrice)).setScale(2, BigDecimal.ROUND_HALF_UP);
            productSpecValueDto.setPrice(priceDec.doubleValue() + "");

            // vip 价格
            basePrice = computeBasePrice(productSpecValueDto,productPriceRuleDto,"vipPrice");
            priceDec = new BigDecimal(vipPrice).divide(new BigDecimal(100)).multiply(new BigDecimal(basePrice)).setScale(2, BigDecimal.ROUND_HALF_UP);
            productSpecValueDto.setVipPrice(priceDec.doubleValue() + "");

            // 业主 价格
            basePrice = computeBasePrice(productSpecValueDto,productPriceRuleDto,"ownerPrice");
            priceDec = new BigDecimal(ownerPrice).divide(new BigDecimal(100)).multiply(new BigDecimal(basePrice)).setScale(2, BigDecimal.ROUND_HALF_UP);
            productSpecValueDto.setOwnerPrice(priceDec.doubleValue() + "");

            // 物业抵扣金 = (业主价-成本价) * x%
            profitDec = new BigDecimal(productSpecValueDto.getOwnerPrice()).subtract(new BigDecimal(productSpecValueDto.getCostPrice()));
            priceDec = new BigDecimal(deduction).divide(new BigDecimal(100)).multiply(profitDec).setScale(2, BigDecimal.ROUND_HALF_UP);
            productSpecValueDto.setDeduction(priceDec.doubleValue() + "");
        }
        return productSpecValueDtos;
    }

    private double computeBasePrice(ProductSpecValueDto productSpecValueDto, ProductPriceRuleDto productPriceRuleDto, String price) {

        if(ProductPriceRuleDto.RULE_TYPE_PUBLIC.equals(productPriceRuleDto.getRuleType())){     //自建链
            return Double.parseDouble(productSpecValueDto.getCostPrice());
        }

        if("otPrice".equals(price)){            //市场价
            return getBasePrice(productSpecValueDto, productPriceRuleDto,productPriceRuleDto.getOtPriceBase()); //.getOtPrice());
        }else if("price".equals(price)){        //销售价
            return getBasePrice(productSpecValueDto, productPriceRuleDto,productPriceRuleDto.getPriceBase());    //.getPrice());
        }else if("vipPrice".equals(price)){     //会员价
            return getBasePrice(productSpecValueDto, productPriceRuleDto,productPriceRuleDto.getVipPriceBase());    //.getVipPrice());
        }else if("ownerPrice".equals(price)){   //业主价
            return getBasePrice(productSpecValueDto, productPriceRuleDto,productPriceRuleDto.getOwnerPriceBase());    //.getOwnerPrice());
        }
        return Double.parseDouble(productSpecValueDto.getCostPrice());
    }

    private double getBasePrice(ProductSpecValueDto productSpecValueDto, ProductPriceRuleDto productPriceRuleDto,String priceBase) {
        if(ProductPriceRuleDto.PRICE_BASE.equals(priceBase)){               //成本价
            return Double.parseDouble(productSpecValueDto.getCostPrice());
        }else if (ProductPriceRuleDto.PRICE_SALE_BASE.equals(priceBase)){   //销售价
            return Double.parseDouble(productSpecValueDto.getPrice());
        }else if (ProductPriceRuleDto.PRICE_OT_BASE.equals(priceBase)){     //市场价
            return Double.parseDouble(productSpecValueDto.getOtPrice());
        }else if (ProductPriceRuleDto.PRICE_OWNER_BASE.equals(priceBase)){  //业主价
            return Double.parseDouble(productSpecValueDto.getOwnerPrice());
        }else if (ProductPriceRuleDto.PRICE_VIP_BASE.equals(priceBase)){    //会员价
            return Double.parseDouble(productSpecValueDto.getVipPrice());
        }
        return Double.parseDouble(productSpecValueDto.getCostPrice());
    }


    @Override
    public int queryProductPriceRulesCount(@RequestBody ProductPriceRuleDto productPriceRuleDto) {
        return productPriceRuleV1ServiceDaoImpl.queryProductPriceRulesCount(BeanConvertUtil.beanCovertMap(productPriceRuleDto));
    }

}
